#include "wxsimagecomboproperty.h"
#include "wxsimagecomboeditordlg.h"

#include <globals.h>

#define VALUE   wxsVARIABLE(Object,Offset,wxArrayString)

wxsImageComboProperty::wxsImageComboProperty( const wxString& PGName, const wxString& _DataName, const wxString& _DataSubName, long _Offset, int Priority ):
  wxsCustomEditorProperty( PGName, _DataName, Priority ),
  Offset( _Offset ),
  DataSubName( _DataSubName ),
  DataName( _DataName ) {}

bool wxsImageComboProperty::ShowEditor( wxsPropertyContainer* Object ) {
  wxsImageComboEditorDlg Dlg( 0 );
  return Dlg.Execute( VALUE );
}

bool wxsImageComboProperty::XmlRead( wxsPropertyContainer* Object, TiXmlElement* Element ) {
  VALUE.Clear();
  if( !Element ) {
    return false;
  }
  for( TiXmlElement* Item = Element->FirstChildElement( cbU2C( DataSubName ) );
       Item;
       Item = Item->NextSiblingElement( cbU2C( DataSubName ) ) ) {
    const char* Text = Item->GetText();
    if( Text ) {
      VALUE.Add( cbC2U( Text ) );
    } else
    { VALUE.Add( wxEmptyString ); }
  }
  return true;
}


bool wxsImageComboProperty::XmlWrite( wxsPropertyContainer* Object, TiXmlElement* Element ) {
  size_t Count = VALUE.Count();
  for( size_t i = 0; i < Count; i++ ) {
    XmlSetString( Element, VALUE[i], DataSubName );
  }
  return Count != 0;
}


bool wxsImageComboProperty::PropStreamRead( wxsPropertyContainer* Object, wxsPropertyStream* Stream ) {
  VALUE.Clear();
  Stream->SubCategory( GetDataName() );
  for( ;; ) {
    wxString Item;
    if( !Stream->GetString( DataSubName, Item, wxEmptyString ) ) {
      break;
    }
    VALUE.Add( Item );
  }
  Stream->PopCategory();
  return true;
}


bool wxsImageComboProperty::PropStreamWrite( wxsPropertyContainer* Object, wxsPropertyStream* Stream ) {
  Stream->SubCategory( GetDataName() );
  size_t Count = VALUE.GetCount();
  for( size_t i = 0; i < Count; i++ ) {
    Stream->PutString( DataSubName, VALUE[i], wxEmptyString );
  }
  Stream->PopCategory();
  return true;
}


wxString wxsImageComboProperty::GetStr( wxsPropertyContainer* Object ) {
  wxString Result;
  size_t Count = VALUE.Count();
  if( Count == 0 ) {
    return _T( "Click to add items" );
  }
  for( size_t i = 0; i < Count; i++ ) {
    wxString Item = VALUE[i];
    Item.Replace( _T( "\"" ), _T( "\\\"" ) );
    if( i > 0 ) {
      Result.Append( _T( ' ' ) );
    }
    Result.Append( wxEmptyString );
    Result.Append( Item );
    Result.Append( wxEmptyString );
  }
  return Result;
}
